//**************************方法调用**********************************
import java.util.Random;
import java.util.Scanner;

public class Test {
    public static void main1(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("请输入一个数字：");
        int n = in.nextInt();
        System.out.println("你输入的数字是：" + n);

        in.nextLine();//这里要处理上一次输入数字后的回车，因为我们按下回车会被读取
        System.out.print("请输入一个名字: ");
        String s = in.nextLine();
        System.out.println("名字是：" + s);

        System.out.print("请输入一个小数: ");
        double a = in.nextDouble();
        System.out.println("你输入的小数是：" + a);
    }

    //多组输入 -- ctrl + D结束输入
    public static void main2(String[] args) {
        Scanner in = new Scanner(System.in);

//        System.out.print("请输入一个数字：");
//        while(in.hasNextInt()) {
//            int tmp = in.nextInt();
//            System.out.println(tmp + " ");
//            System.out.print("请输入一个数字：");
//        }


        //输入一组数，并求这组数的平均数
        double sum = 0;
        int cnt = 0;
        System.out.println("请输入一组数字");
        while(in.hasNextDouble()) {
            double tmp = in.nextDouble();
            sum += tmp;
            cnt++;
        }
        double x = (sum * 1.0) / cnt;
        System.out.println("平均值为：" + x);

    }


    //实现一个猜数字小游戏
    public static void main3(String[] args) {
        Scanner in= new Scanner(System.in);
        Random rm = new Random();

        int guess = rm.nextInt(100);//产生1-100的随机数

        System.out.println("**************猜数字小游戏*************");
        System.out.print("请输入你猜的数字：");
        while(true) {
            int tmp = in.nextInt();
            if(tmp < guess) {
                System.out.println("猜小了");
            }else if(tmp > guess) {
                System.out.println("猜大了");
            }
            else if(tmp == guess) {
                System.out.println("猜对了, 随机数是：" + tmp );
                break;
            }
        }
    }



    //使用方法调用判断是否为闰年
    public static boolean isLeapYear(int year) {
        if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
            return true;
        }else {
            return false;
        }
    }
    public static void main4(String[] args) {
        int y = 2025;
        if(isLeapYear(y)) {
            System.out.println(y + "是闰年");
        } else {
            System.out.println(y + "不是闰年");
        }
    }


    //使用方法调用实现加法 --- 支持重载 --- 重载的要求是方法名相同，参数列表不同，返回值不影响
    public static int add(int a, int b) {
        return a + b;
    }
    public static double add(int a, double b) {
        return a + b;
    }
    public static double add(double a, double b) {
        return a + b;
    }
    public static int add(int a,int b, int c) {
        return a + b + c;
    }
    public static void main5(String[] args) {
        int a = 10;
        int b = 20;
        int c = add(a, b);
        System.out.println(c);

        a = 10;
        double p = 3.14;
        double ret = a + p;
        System.out.println(ret);

        double k = 3.14;
        p = 4.6;
        ret = k + p;
        System.out.println(ret);

        a = 100;
        b = 200;
        int u = 300;
        c = add(a, b, u);
        System.out.println(c);
    }


    //使用方法调用实现1！+ 2！+ 3！+ 4！ + 5！
    public static int fac(int x) {
        int ret = 1;
        for(int i = 1; i <= x; i++) {
            ret *= i;
        }
        return ret;//计算完一个数的阶乘就返回到main中给sum累加起来
    }
    public static void main6(String[] args) {
        int n = 5;
        int sum = 0;
        for(int i = 1; i <= n; i++) {
            sum += fac(i);
        }
        System.out.println(sum);
    }


    //计算连续数字1到N之间的和，将其计算得到的结果扩⼤为2倍
    public static int getSum(int x) {
        int sum = 0;
        for(int i = 1; i <= x; i++) {
            sum += i;
        }
        return sum;
    }
    public static void main7(String[] args) {
        int n = 10;
        int ret = getSum(n) * 2;//得到的返回值 * 2
        System.out.println(ret);
    }


    //使用递归求N的阶乘
    public static int fun(int n) {
        //递归出口
        if(n == 1){
            return 1;
        }

        return n * fun(n - 1);
    }
    public static void main8(String[] args) {
        int n = 5;
        int ret = fun(n);
        System.out.println(ret);
    }


    //使用递归按顺序打印⼀个数字的每⼀位(例如1234打印出1234)
    public static void print(int n) {
        if(n < 10) {
            System.out.print(n + "->");
        } else {
            print(n / 10);
            System.out.print(n % 10 + "->");
        }
    }
    public static void main9(String[] args) {
        int n = 1234567;
        print(n);
    }


    //递归求1+2+3+...+10
    public static int sum1(int n) {
        if(n == 1) {
            return 1;
        }
        return n + sum1(n - 1);
    }
    public static void main10(String[] args) {
        int n = 10;
        int ret = sum1(n);
        System.out.println(ret);
    }


    //输⼊⼀个⾮负整数，返回组成它的数字之和.例如，输⼊1729,则应该返回1+7+2+9，它的和是19
    public static int sum2(int n) {
        if(n < 10) {
            return n;
        } else {
            return (n % 10) + sum2(n/10);

        }
    }
    public static void main11(String[] args) {
        int n = 1729;
        int ret = sum2(n);
        System.out.println(ret);
    }


    //对于斐波那契数 --- 最好还是使用循环方式，因为递归的话会大量重复的计算,非常冗余
    public static void main12(String[] args) {
        int a = 1;
        int b = 1;
        int c = 0;
        int n = 30;//求10的斐波那契数
        //判断一下n是否 > 2
        if(n == 1 || n == 2) {
            c = 1;
            System.out.println(n + "的斐波那契数为：" + c);
            return;
        }
        for(int i = 3; i <= n; i++) {
            c = a + b;
            a = b;
            b = c;
        }
        System.out.println(n + "的斐波那契数为：" + c);
    }



    //在同一个类中定义多个方法：要求不仅可以求2个整数的最大值，还可以求3个小数的最大值
    public static int max(int x, int y) {
        return (x > y? x : y);
    }
    public static int max(int x, int y, int z) {
        int max = x > y? x : y;
        if(max > z) {
            return max;
        }else {
            return z;
        }
    }
    public static void main13(String[] args) {
        int a = 10;
        int b = 20;
        int c = 10086;

        System.out.println("最大值为：" + max(a,b));
        System.out.println("最大值为：" + max(a,b,c));
    }



    
    //汉诺塔问题
    public static void move(char pos1, char pos2) {
        System.out.print(pos1 + "->" + pos2 + "  ");
    }

    /**
     *
     * @param n 盘子个数
     * @param pos1 起始位置
     * @param pos2 中转位置
     * @param pos3 目的地位置
     */
    public static void hanio(int n, char pos1, char pos2, char pos3) {
        if(n == 1) {
            move(pos1,pos3);//如果剩下一个盘子，那么就从pos1的盘子移动到pos3盘子
            return;
        }

        hanio(n-1, pos1, pos3, pos2);//从pos1位置，借助pos3，把n-1个盘子移动到pos2位置

        move(pos1, pos3);//然后pos1就剩下一个盘子，直接移动到pos3即可

        hanio(n-1, pos2, pos1, pos3);//继续 --- 把pos2的n-1个盘子，借助pos1.把n-1个盘子移动到pos3位置
    }

    public static void main(String[] args) {
        hanio(3, 'A', 'B', 'C');
    }

}

























